/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica.entidades;

import java.awt.Rectangle;
import java.util.ArrayList;

/**
 *
 * @author Ana, Danny
 */
public class Barco extends Rectangle{
    private static int ALCANCE_PROYECTIL = 50;
    private int id;
    private int velocidad;
    private int blindaje;
    private Orientacion orientacion;   
    private boolean seMovioBarco;
    private int proyectiles;
    private boolean seLanzoProyectil;
    private Rectangle rangoVision;
    
    public Barco(int proyectiles, Rectangle bounds, int id, int velocidad, int blindaje, Orientacion orientacion,Rectangle rangoVision) {
        this.proyectiles = proyectiles;
        this.id = id;
        this.velocidad = velocidad;
        this.blindaje = blindaje;
        this.orientacion = orientacion;
        this.setBounds(bounds);
        this.seMovioBarco = false; 
        this.seLanzoProyectil = false;
        this.rangoVision = rangoVision;
    }
    
    public Barco(){
    
    }
    public Barco(int idBarco)
    {
        this.id = idBarco;
    }
    public void SetRangoVision(Rectangle vision)
    {
        this.rangoVision = vision;
    }
    public Rectangle GetRangoVision()
    {
        return this.rangoVision;
    }
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int GetAlcanceProyectil()
    {
        return ALCANCE_PROYECTIL;
    }
    public int getVelocidad() {
        return velocidad;
    }

    public int getBlindaje() {
        return blindaje;
    }

    public Orientacion getOrientacion() {
        return orientacion;
    }

    public void setVelocidad(int velocidad) {
        this.velocidad = velocidad;
    }

    public void setProyectiles(int proyectiles) {
        this.proyectiles = proyectiles;
    }
    
    public void setBlindaje(int blindaje) {
        this.blindaje = blindaje;
    }

    public void setOrientacion(Orientacion orientacion) {
        this.orientacion = orientacion;
    }
    public void setMovioBarco(boolean movi)
    {
        this.seMovioBarco = movi;
    }
    
    public boolean getSeLanzoProyectil() {
        return seLanzoProyectil;
    }
    
    public void moverRangoVison(Coordenada coord) {
        int visionX = 0;
        int visionY = 0;

        visionX = (int)(coord.getCordX() - (5 * this.getWidth()) /2) + 20;
        visionY = (int)(coord.getCordY() - (5 * this.getHeight()) /2) + 20;
       

        this.rangoVision.setLocation(visionX, visionY);
    }
    
    public int getProyectiles() {
        System.out.println("proyectiles: " + proyectiles);
        return proyectiles;
    }
     public Boolean seMovioElBarco() {
        return this.seMovioBarco;
    }
    public void setSeLanzoProyectil(boolean seLanzoProyectil) {
        this.seLanzoProyectil = seLanzoProyectil;
    }
    public void MoverBarco(Coordenada coord)
    {
        this.setMovioBarco(true);
        int posX = coord.getCordX() - (this.width / 2);
        int posY = coord.getCordY() - (this.height / 2);
        this.moverRangoVison(coord);
        this.setLocation(posX, posY);
    }
    public void actualizarOrientacion(Coordenada coord) {
        
        double xAct, yAct;
        //obtener coordenadas actuales
        xAct= this.getX();
        yAct= this.getY();

        Rectangle rectSur = new Rectangle((int)this.getX(), (int)(this.getY() + (this.getHeight())), (int)this.getWidth(), (int)this.getHeight());
        Rectangle rectNorte = new Rectangle((int)this.getX(), (int)(this.getY() - this.getHeight()), (int)this.getWidth(), (int)this.getHeight());
        Rectangle rectEste = new Rectangle((int)(this.getX() + this.getWidth()), (int)this.getY(), (int)this.getWidth(), (int)this.getHeight());
        Rectangle rectOeste = new Rectangle((int)(this.getX() - this.getWidth()), (int)this.getY(), (int)this.getWidth(), (int)this.getHeight());
        

        Rectangle rectSureste = new Rectangle((int)(this.getX()+ this.getWidth()), (int)(this.getY()+ this.getHeight()), (int)this.getWidth(), (int)this.getHeight());
        Rectangle rectNoreste = new Rectangle((int)(this.getX()+ this.getWidth()), (int)(this.getY()- this.getHeight()), (int)this.getWidth(), (int)this.getHeight());
        Rectangle rectNoroeste = new Rectangle((int)(this.getX()- this.getWidth()), (int)(this.getY() - this.getHeight()), (int)this.getWidth(), (int)this.getHeight());
        Rectangle rectSuroeste = new Rectangle((int)(this.getX() - this.getWidth()), (int)(this.getY() + this.getHeight()), (int)this.getWidth(), (int)this.getHeight());

        
        if(rectNorte.contains(coord.getCordX(), coord.getCordY())) {            
            this.setOrientacion(Orientacion.NORTE);
            System.out.println("ORIENTACION NORTE");
        }
        
        if(rectSur.contains(coord.getCordX(), coord.getCordY())) {
            this.setOrientacion(Orientacion.SUR);
            System.out.println("ORIENTACION SUR");
        }
        
        if(rectEste.contains(coord.getCordX(), coord.getCordY())) {
            this.setOrientacion(Orientacion.ESTE);
            System.out.println("ORIENTACION ESTE");
        }

        if(rectOeste.contains(coord.getCordX(), coord.getCordY())) {
            this.setOrientacion(Orientacion.OESTE);
            System.out.println("ORIENTACION OESTE");
        }
        
        if(rectNoreste.contains(coord.getCordX(), coord.getCordY())) {
            this.setOrientacion(Orientacion.NORESTE);
            System.out.println("ORIENTACION NORESTE");
        }
        
        if(rectSureste.contains(coord.getCordX(), coord.getCordY())) {
            this.setOrientacion(Orientacion.SURESTE);
            System.out.println("ORIENTACION SURESTE");
        }
        
        if(rectSuroeste.contains(coord.getCordX(), coord.getCordY())) {
            this.setOrientacion(Orientacion.SUROESTE);
            System.out.println("ORIENTACION SUROESTE");
        }

        if(rectNoroeste.contains(coord.getCordX(), coord.getCordY())) {
            this.setOrientacion(Orientacion.NOROESTE);
            System.out.println("ORIENTACION NOROESTE");
        }
    }
     public void agregarDimensiones(int ancho, int alto) {
        this.setSize(ancho, alto);
    }
     //Ubica el barco en una Coordenada dada
    public void ubicarBraco(Coordenada coordenada) {
        this.setLocation(coordenada.getCordX(), coordenada.getCordY());
    }
    
    //Retorna la ubicacion del barco
    public Coordenada obtenerUbicacion() {
        Coordenada coordenada = new Coordenada((int)this.getX(), (int)this.getY());
        return coordenada;
    }
    public boolean seLanzoProyectil()
    {
        return this.getSeLanzoProyectil();
    }
    
    /////////
    public Coordenada determinarPuntoImpactoProyectil(int barco) {
        
        Coordenada coordImpacto = new Coordenada();
        int nuevaCoordX = 0;
        int nuevaCoordY = 0;
        
        if(barco == 0){ //Minador
            ALCANCE_PROYECTIL = 50;
        } else {
            ALCANCE_PROYECTIL = 100;
        }
        switch(this.getOrientacion()) {
            case SUR:
                System.out.println("IMPACTO NORTE");
                nuevaCoordX = (int)this.getCenterX();
                nuevaCoordY = (int)(this.getCenterY() + (this.getHeight()/2) + ALCANCE_PROYECTIL);
                break;
            case NORTE:
                System.out.println("IMPACTO SUR");
                nuevaCoordX = (int)this.getCenterX();
                nuevaCoordY = (int)(this.getCenterY() - (this.getHeight()/2) - ALCANCE_PROYECTIL);
                break;
            case ESTE: 
                System.out.println("IMPACTO ESTE");
                nuevaCoordX = (int)(this.getX() + this.getWidth() + ALCANCE_PROYECTIL);
                nuevaCoordY = (int)this.getCenterY();
                break;
            case OESTE:
                System.out.println("IMPACTO OESTE");
                nuevaCoordX = (int)(this.getX() - (this.height/4) - ALCANCE_PROYECTIL);
                nuevaCoordY = (int)this.getCenterY();
                break;
            case NORESTE:
                System.out.println("IMPACTO NORESTE");
                nuevaCoordX = (int)((this.getCenterX() + (this.height/4)) + ALCANCE_PROYECTIL);
                nuevaCoordY = (int)((this.getCenterY() - (this.height/4)) - ALCANCE_PROYECTIL);
                break;                           
            case SURESTE:
                System.out.println("IMPACTO SURESTE");
                nuevaCoordX = (int)(this.getCenterX() + (this.height/4) + ALCANCE_PROYECTIL);
                nuevaCoordY = (int)(this.getCenterY() + (this.height/4) + ALCANCE_PROYECTIL);
                break; 
            case SUROESTE: //Ver
                System.out.println("IMPACTO SUROESTE");
                nuevaCoordX = (int)((this.getCenterX() - (this.height/2)) - ALCANCE_PROYECTIL);
                nuevaCoordY = (int)((this.getCenterY() + (this.height/2)) + ALCANCE_PROYECTIL);
                break;   
            case NOROESTE: //
                System.out.println("IMPACTO NOROESTE");
                nuevaCoordX = (int)(this.getCenterX() - (this.height/2) - ALCANCE_PROYECTIL);
                nuevaCoordY = (int)(this.getCenterY() - ((this.height/2) + ALCANCE_PROYECTIL));
                break;                                                                                                                                                                                                                    
        }
        
        coordImpacto.setCordX(nuevaCoordX);
        coordImpacto.setCordY(nuevaCoordY);
        
        return coordImpacto;
    }
    
    public Coordenada determinarPuntoDePartidaProyectil() {
        Coordenada coordImpacto = new Coordenada();
        int nuevaCoordX = 0;
        int nuevaCoordY = 0;

        switch(this.getOrientacion()) {
            case SUR: {
                System.out.println("PARTIDA NORTE");
                nuevaCoordX = (int)this.getCenterX();
                nuevaCoordY = (int)(this.getCenterY() + (this.height/2));
                break; }
            case NORTE: {
                System.out.println("PARTIDA SUR");
                nuevaCoordX = (int)this.getCenterX();
                nuevaCoordY = (int)(this.getCenterY() - (this.height/2));
                break;}
            case ESTE: {
                System.out.println("PARTIDA ESTE");
                nuevaCoordX = (int)(this.getX() + this.width);
                nuevaCoordY = (int)this.getCenterY();
                break; }
            case OESTE: {
                System.out.println("PARTIDA OESTE");
                nuevaCoordX = (int)(this.getX() - (this.height/4));
                nuevaCoordY = (int)this.getCenterY();
                break;}
            case NORESTE: {
                System.out.println("PARTIDA NORESTE");
                nuevaCoordX = (int)(this.getCenterX() + (this.height/4));
                nuevaCoordY = (int)(this.getCenterY() - (this.height/4));
                break;}                         
            case SURESTE: {
                System.out.println("PARTIDA SURESTE");
                nuevaCoordX = (int)(this.getCenterX() + (this.height/4));
                nuevaCoordY = (int)(this.getCenterY() + (this.height/4));

                break;}
            case SUROESTE: {
                System.out.println("PARTIDA SUROESTE");
                nuevaCoordX = (int)(this.getCenterX() - (this.height/2));
                nuevaCoordY = (int)(this.getCenterY() + (this.height/2));
                break;}   
            case NOROESTE: {
                System.out.println("PARTIDA NOROESTE");
                nuevaCoordX = (int)(this.getCenterX() - (this.height/2));
                nuevaCoordY = (int)(this.getCenterY() - (this.height/2));
                break;}                                                                                                                                                                                                                   
        }

        coordImpacto.setCordX(nuevaCoordX);
        coordImpacto.setCordY(nuevaCoordY);

        return coordImpacto;
    } 
    
    //Retorna true si se produjo un impacto sobre el area del barco, flase en caso contrario
    public Boolean seProdujoImpacto(Rectangle rectangle) {
        Rectangle rectBarco = this.getBounds();
        return rectBarco.intersects(rectangle);
    }
    
    //Retorna true si el barco fue hundido, false en caso contrario
    public Boolean seHundioBarco() {
        return (this.getBlindaje() == 0);
    }
    
    //Pre cond: se produjo un impacto en el barco.
    //Se decrementa el blindaje del barco, si este llega a cero el barco se hunde.
    public void recibirImpacto() {
        this.setBlindaje(this.getBlindaje() - 1);
    }    
    
    public void moviElBarco() {
        this.setMovioBarco(true);
    }
    
    public boolean tengoProyectiles() {
        System.out.println("Cantidad de proyectiles: " + this.getProyectiles());
        return (this.getProyectiles() > 0);
    }
    
    public ArrayList<String> lanzarProyectil(int barco) {
        
        this.setSeLanzoProyectil(true);
        this.setProyectiles(this.getProyectiles() -1);
        
        ArrayList<String> trayectoria = new ArrayList<String>();
        Coordenada coordPtoPartida = this.determinarPuntoDePartidaProyectil();
        Coordenada coordPtoImpacto = this.determinarPuntoImpactoProyectil(barco);
        
        String ptoPartida = coordPtoPartida.getCordX() + "," + coordPtoPartida.getCordY();
        String ptoImpacto = coordPtoImpacto.getCordX() + "," + coordPtoImpacto.getCordY();
        
        trayectoria.add(0, ptoPartida);
        trayectoria.add(1, ptoImpacto);
        return trayectoria;
        
    }
    
}
